package com.winchain.chainbill.tbill.basic.service.impl;

import com.shell.bee.acct.account.po.AcctBas;
import com.shell.bee.acct.account.po.AcctBkp;
import com.shell.bee.base.utils.DateUtil;
import com.shell.bee.base.utils.StringUtil;
import com.shell.constant.rel.AssetCode;
import com.shell.framework.utils.CommonDataUtil;
import com.shell.framework.utils.ParameterHelper;
import com.shell.framework.utils.SysDateUtil;
import com.shell.governor.modules.vo.ParameterVo;
import com.winchain.chainbill.basic.cus.po.CusRec;
import com.winchain.chainbill.basic.cus.service.CusRecService;
import com.winchain.chainbill.tbill.basic.service.TBillCheckService;
import com.winchain.chainbill.tbill.biz.vo.TbRecVo;
import com.winchain.chainbill.trade.service.BillAcctBlcService;
import com.winchain.chainbill.trade.service.BillAcctService;
import java.math.BigDecimal;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class TBillCheckServiceImpl implements TBillCheckService {
	@Autowired
	private CusRecService cusRecService;
	@Autowired
	private BillAcctService billAcctService;
	@Autowired
	private BillAcctBlcService billAcctBlcService;

	public String checkSnd(TbRecVo tbRecVo) {
		String msg = checkSndData(tbRecVo);
		if (StringUtil.notEmpty(msg)) {
			return msg;
		}
		msg = checkBuyer(tbRecVo);
		if (StringUtil.notEmpty(msg)) {
			return msg;
		}
		msg = checkSeller(tbRecVo);
		if (StringUtil.notEmpty(msg)) {
			return msg;
		}
		msg = checkConfirmer(tbRecVo);
		if (StringUtil.notEmpty(msg)) {
			return msg;
		}
		return "";
	}

	public String checkDct(TbRecVo tbRecVo) {
		String msg = checkSellDate(tbRecVo);
		if (StringUtil.notEmpty(msg)) {
			return msg;
		}
		msg = checkSellMoney(tbRecVo);
		if (StringUtil.notEmpty(msg)) {
			return msg;
		}
		ParameterVo blTimes = ParameterHelper.getParameter("6", "DCT_LIM_BL_TIM", tbRecVo.getGrpId());
		if ((blTimes != null) && (!StringUtil.emptyAndNull(blTimes.getParmValue()))) {
			String[] strings = blTimes.getParmValue().split(",");
			if ((!SysDateUtil.compareTime(strings[0] + ":00")) || (SysDateUtil.compareTime(strings[1] + ":59"))) {
				return "������������������������" + strings[0] + "-" + strings[1] + ",������������������������";
			}
		}
		return null;
	}

	private String checkSellData(TbRecVo tbRecVo) {
		BigDecimal sellMoney = tbRecVo.getDctAmt();
		if ((StringUtil.emptyAndNull(String.valueOf(sellMoney)))
				|| (sellMoney.setScale(2, 4).compareTo(BigDecimal.ZERO) <= 0)) {
			return "��������������������������0";
		}
		return "";
	}

	private String checkSellMoney(TbRecVo tbRecVo) {
		BigDecimal sellMoney = tbRecVo.getBillAmt();
		AcctBkp bkp = this.billAcctBlcService.getCreditAcctBkpByCont(tbRecVo.getFinId(), tbRecVo.getBuyerId(),
				AssetCode.XTB.name(), "41");
		BigDecimal availAmt = bkp.getAcctBlc().subtract(bkp.getAcctBlk());
		if (sellMoney.compareTo(availAmt) == 1) {
			return "������������������������" + availAmt;
		}
		return "";
	}

	private String checkSellDate(TbRecVo tbRecVo) {
		String dctDate = SysDateUtil.getSystemDate();
		String expDate = tbRecVo.getExpDate();
		if (DateUtil.compare(dctDate, expDate) == 1) {
			return "������������";
		}
		tbRecVo.setDctDate(dctDate);
		return "";
	}

	private String checkConfirmer(TbRecVo tbRecVo) {
		if (StringUtil.emptyAndNull(tbRecVo.getConfirmerBankNo())) {
			return "����������������������";
		}
		return "";
	}

	private String checkSeller(TbRecVo tbRecVo) {
		String sellerId = CommonDataUtil.getCurEntId();
		if (StringUtil.emptyAndNull(tbRecVo.getSellerNm())) {
			return "������������������";
		}
		if (StringUtil.emptyAndNull(tbRecVo.getSellerAcctNo())) {
			return "������������������";
		}
		if (StringUtil.emptyAndNull(tbRecVo.getSellerBankNm())) {
			return "����������������������";
		}
		CusRec cus = (CusRec) this.cusRecService.selectByKey(sellerId);
		String cusState = cus.getCusState();
		if (!"E".equals(cusState)) {
			return "������������������������������������������������";
		}
		String acctNo = getAcctNo(cus.getCusId());
		if (StringUtil.emptyAndNull(acctNo)) {
			return "����������������������";
		}
		return "";
	}

	private String checkBuyer(TbRecVo tbRecVo) {
		if (StringUtil.emptyAndNull(tbRecVo.getBuyerNm())) {
			return "������������������";
		}
		if (StringUtil.emptyAndNull(tbRecVo.getBuyerAcctNo())) {
			return "������������������";
		}
		if (StringUtil.emptyAndNull(tbRecVo.getBuyerBankNm())) {
			return "����������������������";
		}
		CusRec cus = this.cusRecService.selectByName(tbRecVo.getBuyerNm());
		if (cus == null) {
			return "��������������������������������";
		}
		String cusState = cus.getCusState();
		if (!"E".equals(cusState)) {
			return "����������������������������������������������";
		}
		String acctNo = getAcctNo(cus.getCusId());
		if (StringUtil.emptyAndNull(acctNo)) {
			return "����������������������������������������������������������������������";
		}
		tbRecVo.setBuyerId(cus.getCusId());
		tbRecVo.setGrpId(cus.getGrpId());
		tbRecVo.setGrpNm(cus.getGrpName());
		return "";
	}

	private String getAcctNo(String cusId) {
		String acctNo = "";
		AcctBas acct = this.billAcctService.getAcctBas(cusId, null, "00");
		if (acct != null) {
			acctNo = acct.getAcctNo();
		}
		return acctNo;
	}

	private String checkSndData(TbRecVo tbRecVo) {
		if (StringUtil.emptyAndNull(tbRecVo.getBillCode())) {
			return "��������������";
		}
		if (StringUtil.emptyAndNull(tbRecVo.getBillAmt().toString())) {
			return "��������������";
		}
		if (StringUtil.emptyAndNull(tbRecVo.getSndDate())) {
			return "��������������";
		}
		if (StringUtil.emptyAndNull(tbRecVo.getExpDate())) {
			return "����������������";
		}
		if (tbRecVo.getExpDate().compareTo(tbRecVo.getSndDate()) < 0) {
			return "��������������������������������";
		}
		return "";
	}
}
